/**
 * 动态代理
 * 为每个类的每个方法添加一个日志功能
 * 通过原型动态代理
 * 优点：省内存
 * 缺点: 污染原型，需要添加多余代码
 */

import { GamePlayer } from "./ProxyStatic";

/**
 * @description 函数代理，方法是挂在原型上的，所以修改方法就得修改原型
 * 如果不修改原型的话，就得把方法挂在当前的对象下，这会占用内存
 * @param _gamePlayer 
 */
function dynamicProxy(_gamePlayer: GamePlayer) {
  const _methods = Object.getPrototypeOf(_gamePlayer)
  _gamePlayer.isProxy = true;
  Object.keys(_methods).forEach((func) => {
    const _copy = _methods[func];
    _methods[func] = function () {
      if (this.isProxy) {
        console.log(func + '被动态代理了');
        _copy.call(this)
      } else {
        _copy.call(this)
      }
    }
  })
}

const gamePlayer = new GamePlayer('张三')
dynamicProxy(gamePlayer)
gamePlayer.login()
gamePlayer.killBoss()
gamePlayer.upgrade()
console.log('----------------');

const gamePlayer1 = new GamePlayer('张三1')
gamePlayer1.login()
gamePlayer1.killBoss()
gamePlayer1.upgrade()
